#pragma once
#include "traffic.h"

/******************************道路基类************************/
class RoadBase {
  public:
    virtual ~RoadBase() = default; // 虚析构函数
    virtual void ShowRoad() = 0; // 纯虚函数，配合后面使用多态进行重写

    virtual double GetUpLine() {return 0.0;}
    virtual double GetDownLine() {return 0.0;}
    virtual double GetMidLine() {return 0.0;}
  
  public:
   double Rwidth = 200.0; // 车道宽
   double up_boundary = 0.0; // 上边界
   double down_boundary = 0.0; // 下边界
   double left_boundary = 0.0; // 左边界
   double right_boundary = 0.0; // 右边界
};

/************************一般道路*****************************/ 
// 继承于道路基类
class RoadNormal : public RoadBase {
  public:
    // 构造函数
    RoadNormal(const double& r_width = 200.0);
    // 重写基类纯虚函数，加上关键字override告知编译器我要重写
    void ShowRoad() override; // 绘制道路

};  

/************************斑马线道路*****************************/
class RoadCrosswalk : public RoadBase {
  public:
    // 构造函数
    RoadCrosswalk(const double& r_width = 200.0);
    // 重写基类纯虚函数，加上关键字override告知编译器我要重写
    void ShowRoad() override; // 绘制道路
    // 因为使用的多态用法，需要用父类的指针指向子类，即调用子类的函数，但父类指针调不到子类的成员变量
    // 所以写一个获取函数用于使用父类指针获取子类成员变量的值。同时需要将这几个获取值的函数再基类进行虚函数声明
    // 因为子类重写的父类虚函数会调用子类而不是父类
    double GetUpLine() {return this->up_line;}
    double GetDownLine() {return this->down_line;}
    double GetMidLine() {return this->mid_line;}
  
  public:
    // 斑马线上边界
    double up_line = 0.0;
    // 斑马线下边界
    double down_line = 0.0;
    // 斑马线中心线
    double mid_line = 0.0;
    // 间距
    double disRec = 0.0;
};

/************************双车道线道路*****************************/
class RoadDoubleLane : public RoadBase {
  public: 
    RoadDoubleLane(const double& r_width = 200.0);
    void ShowRoad();
};
